﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "IDbObject.h"

namespace gcmp
{
    class IParameterValidator;
    class UniIdentity;
    class IElement;

    /// \brief 针对单个参数进行行为覆盖的接口类
    ///
    /// 需要定制时，需要创建一个参数行为，设置给Parameter。
    /// 注意区别于针对Element所有参数进行定制的IElementParameters和IElementParametersCustomizer
    class GCMP_MODEL_INTERFACE_EXPORT IParameterOverride : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IParameterOverride, gcmp::IDbObject);
    public:
        /// \brief 获取参数的跨文档的唯一标识符
        /// \return UniIdentity
        virtual UniIdentity GetUniIdentity() const = 0;

        /// \brief 是否使用IsModifiable()进行覆盖
        /// \return bool 返回true，则会采用IsModifiable()的返回值；否则忽略IsModifiable()。
        /// \see IsModifiable()
        virtual bool ShouldOverrideIsModifiable() const = 0;

        /// \brief 该参数是否可修改
        ///
        /// 被调用前置条件：ShouldOverrideIsModifiable()返回true
        /// \return bool 是否可修改
        /// \see ShouldOverrideIsModifiable()
        virtual bool IsModifiable() const = 0;

        /// \brief 是否使用IsUserVisible()进行覆盖
        /// \return bool 返回true，则会采用IsUserVisible()的返回值；否则忽略IsUserVisible()。
        /// \see IsUserVisible()
        virtual bool ShouldOverrideIsUserVisible() const = 0;

        /// \brief 该参数用户是否可见
        ///
        /// 被调用前置条件：ShouldOverrideIsUserVisible()返回true
        /// \return bool 用户是否可见
        /// \see ShouldOverrideIsUserVisible()
        virtual bool IsUserVisible() const = 0;

        /// \brief 是否使用GetName()进行覆盖
        /// \return bool 返回true，则会采用GetName()的返回值；否则忽略GetName()。
        /// \see GetName() 
        virtual bool ShouldOverrideGetName() const = 0;

        /// \brief 获取该参数的名称
        ///
        /// 被调用前置条件：ShouldOverrideGetName()返回true
        /// \return std::wstring 名称
        /// \see ShouldOverrideGetName()
        virtual std::wstring GetName() const = 0;

        /// \brief 是否使用GetValidator()进行覆盖
        /// \return bool 返回true，则会采用GetValidator()的返回值；否则忽略GetValidator()。
        /// \see GetValidator()
        virtual bool ShouldOverrideGetValidator() const = 0;

        /// \brief 获取该参数的验证器
        ///
        /// 被调用前置条件：ShouldOverrideGetValidator()返回true
        /// \return const IParameterValidator * 只读验证器
        /// \see IParameterValidator ShouldOverrideGetValidator()
        virtual const IParameterValidator * GetValidator() const = 0;

        /// \brief 获取OwnerElement
        /// \return IElement* OwnerElement指针
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 获取OwnerElement
        /// \return IElement* OwnerElement指针
        virtual IElement* GetOwnerElement() = 0;

        /// \brief 设置OwnerElement
        /// \param pOwnerElement* 
        /// \return bool 是否设置成功
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;
    };
}



